home *** CD-ROM | disk | FTP | other *** search
AMOS Source Code | 1994-08-11 | 5.8 KB | 247 lines |
- ' *****************************
- ' * Othello by Dominic Ludlam *
- ' * Converted from the 64 *
- ' * in October 1993 *
- ' * Modified in October '94 *
- ' *****************************
-
- Dim B(8,8),C(8),D(8,2),X(60),Y(60),N(60)
- Global B(),C(),D(),X(),Y(),N(),CP,PS,CS,EN
- OTHELLO
- '
- Procedure OTHELLO
-
- STRT:
- Screen Open 1,320,256,32,Lowres
- Curs Off : Cls 0 : Paper 0
- Centre "Othello"
- Draw 128,8 To 182,8
- Colour 5,$80
- Colour 6,$80
- Reserve Zone 64
- SETUPZONES
-
- _ASK:
- Locate 0,13
- Centre "Do you want first go (Y or N)" : Input X$
- X$=Left$(X$,1) : CP=1 : If X$="n" Then CP=2
- If(X$<>"y") and(X$<>"n") Then Goto _ASK
- Curs Off
-
- B(4,4)=1 : B(4,5)=2 : B(5,4)=2 : B(5,5)=1
- For F=1 To 8 : Read A : D(F,1)=A : Read A : D(F,2)=A : Next
- Data -1,-1,0,-1,1,-1,-1,0,1,0,-1,1,0,1,1,1
- _DRAWTHEBOARD
-
- MAIN_LOOP:
- _UPDATETHEBOARD
- If CS+PS=64 Then Gosub GAME_OVER
- EG=0 : If CP=1 Then _PLAYERSMOVE : _UPDATETHEBOARD : If EG=1 Then Gosub GAME_OVER
- If CS+PS=64 Then Gosub GAME_OVER
- If CP=2 Then _COMPUTERSMOVE
- Goto MAIN_LOOP
-
- GAME_OVER:
- Locate 0,29
- If CS>PS Then Print "That was Easy!!!"
- If CS=PS Then Print "We drew, I need some practice!"
- If CS<PS Then Print "You were lucky!"
- _ASK4:
- Locate 0,30 : Print "Do you want another game? (Y/N)"; : Input X$
- X$=Upper$(X$)
- If X$="Y"
- For X=1 To 8
- For Y=1 To 8
- B(X,Y)=0
- Next
- Next
- Goto STRT
- End If
- If(X$<>"Y") and(X$<>"N") Then Goto _ASK4
- End
-
- End Proc
- Procedure _UPDATETHEBOARD
-
- CS=0
- PS=0
- For F=1 To 8
- For G=1 To 8
- X=((F-1)*26)+12
- Y=((G-1)*26)+12
- If(B(F,G)=1) and Point(X,Y)<>2 Then Ink 2 : Paint X,Y,1
- If(B(F,G)=2) and Point(X,Y)<>1 Then Ink 0 : Paint X,Y,1
- If B(F,G)=1 Then PS=PS+1
- If B(F,G)=2 Then CS=CS+1
- Next G
- Next F
- Locate 27,1 : Print "1" : Locate 27,4 : Print "2" : Locate 27,8 : Print "3"
- Locate 27,11 : Print "4" : Locate 27,14 : Print "5" : Locate 27,18 : Print "6"
- Locate 27,21 : Print "7" : Locate 27,24 : Print "8"
- Locate 0,27 : Print " 1 2 3 4 5 6 7 8"
- Locate 33,1 : Print "Othello"
- Locate 34,3 : Print "Player"
- Locate 34,4 : Print " " : Locate 34,4 : Print PS
- Locate 32,6 : Print "Computer"
- Locate 34,7 : Print " " : Locate 34,7 : Print CS
-
- End Proc
- Procedure _DRAWTHEBOARD
-
- Cls 0
- Ink 5
- Bar 0,0 To 208,208
- Ink 2
- For X=0 To 208 Step 26
- Draw X,0 To X,208
- Next X
- For Y=0 To 208 Step 26
- Draw 0,Y To 208,Y
- Next
- Ink 6
- For Z=13 To 208 Step 26
- For Y=13 To 208 Step 26
- Circle Z,Y,10
- Next
- Next
-
- End Proc
- Procedure _PLAYERSMOVE
-
- _ASK2:
- Repeat
- If Mouse Click=2 Then CP=2 : Pop Proc
- If Mouse Click=3 Then EG=1 : Pop Proc
- Until Mouse Zone>0 and Mouse Click=1
- X=(Mouse Zone/8)+1
- Y=(Mouse Zone mod 8)
- If Y=0 Then Y=8
- If Y=8 Then X=Mouse Zone/8
- If(X<1 or X>8) or(Y<1 or Y>8) Then Goto _ASK2
- If B(X,Y)>0 Then Goto BAD_MOVE
- NF=0
-
- For F=1 To 8
- CF=0
- If X+D(F,1)=9 or X+D(F,1)=0 Then Goto SKIPPED
- If Y+D(F,2)=9 or Y+D(F,2)=0 Then Goto SKIPPED
- If X+D(F,1)=9 or X+D(F,1)=0 Then Goto SKIPPED
- If B((X+D(F,1)),(Y+D(F,2)))=2 Then CF=1 : NF=1
- SKIPPED:
- C(F)=0 : If CF=1 Then C(F)=F
- Next F
- If NF<>1 Then Goto BAD_MOVE
- RF=0
-
- For Q=1 To 8
- If C(Q)=0 Then Goto SKIPPED2
- XP=X : YP=Y
- O:
- Add XP,D(Q,1)
- Add YP,D(Q,2)
- If(XP=0 or XP=9) or(YP=0 or YP=9) Then C(Q)=0 : Goto SKIPPED2
- If B(XP,YP)=2 Then Goto O
- If B(XP,YP)=1 Then RF=1 : Goto SKIPPED2
- If B(XP,YP)=0 Then C(Q)=0
- SKIPPED2:
- Next
-
- If RF<>1 Then Goto BAD_MOVE
- For Q=1 To 8
- If C(Q)=0 Then Goto _NEXT
- XP=X+D(Q,1) : YP=Y+D(Q,2)
- TEST:
- If B(XP,YP)=1 Then Goto _NEXT
- B(XP,YP)=1
- XP=XP+D(Q,1)
- YP=YP+D(Q,2)
- Goto TEST
- _NEXT:
- Next Q
- B(X,Y)=1
- CP=2 : Pop Proc
-
- BAD_MOVE:
- If B(X,Y)>0 Then Locate 0,29 : Cline : Print "You cannot move onto an occupied square" : Wait 100 : Goto _ASK2
- If NF<>1 Then Locate 0,29 : Cline : Print "Your move isn't next to one of my pieces" : Wait 100 : Goto _ASK2
- If RF<>1 Then Locate 0,29 : Cline : Print "Your move doesn't flank a row" : Wait 100 : Goto _ASK2
- Goto _ASK2
-
- End Proc
- Procedure _COMPUTERSMOVE
-
- Locate 0,29 : Print "Thinking..."
- NF=1
- MX=0
- For X=1 To 8
- For Y=1 To 8
- If B(X,Y)<>0 Then Goto _NEXT2
- For F=1 To 8
- XP=X
- YP=Y
- DX=D(F,1)
- DY=D(F,2)
- RF=0
- P:
- XP=XP+DY : YP=YP+DX : If(XP=0 or XP=9) or(YP=0 or YP=9) Then Goto _NEXT3
- If B(XP,YP)=1 Then RF=1 : Goto P
- If B(XP,YP)=2 and RF=1 Then N(NF)=F : X(NF)=X : Y(NF)=Y : NF=NF+1 : F=9
- _NEXT3:
- Next F
- _NEXT2:
- Next Y
- Next X
- NF=NF-1
- If NF=0 Then Goto NO_MOVE
-
- For F=1 To NF
- X=X(F)
- Y=Y(F)
- DX=D(N(F),1)
- DY=D(N(F),2)
- CF=0
- _LOOP:
- X=X+DY : Y=Y+DX : If B(X,Y)=1 Then CF=CF+1 : Goto _LOOP
- If CF>MX Then MX=CF : MF=F
- Next
-
- For F=1 To 8
- X=X(MF)
- Y=Y(MF)
- DX=D(F,1)
- DY=D(F,2)
- _LOOP2:
- X=X+DY : Y=Y+DX
- If(X=0 or X=9) or(Y=0 or Y=9) Then Goto _NEXT4
- If B(X,Y)=1 Then Goto _LOOP2
- If B(X,Y)=2 Then Goto SKIPPED3
- If B(X,Y)=0 Then Goto _NEXT4
- SKIPPED3:
- X=X(MF)
- Y=Y(MF)
- _LOOP3:
- B(X,Y)=2
- X=X+DY
- Y=Y+DX
- If B(X,Y)=2 Then Goto _NEXT4
- Goto _LOOP3
- _NEXT4:
- Next
- Locate 0,29 : Cline
- CP=1 : Pop Proc
-
- NO_MOVE:
- Locate 0,29 : Print "I can't make a move" : Wait 100 : CP=1 : Pop Proc
-
- End Proc
- Procedure SETUPZONES
-
- Z=1
- For X=1 To 208 Step 26
- For Y=1 To 208 Step 26
- Set Zone Z,X,Y To X+25,Y+25
- Inc Z
- Next Y
- Next X
-
- End Proc